﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Unimaq.Macroprocesos.LogicaNegocio;
using MacroprocesosWinForms.Administrador.DialogBox;

namespace MacroprocesosWinForms.Administrador.ControlUsuario
{
    public partial class Proceso : UserControl
    {
        private Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso;
        private Unimaq.Macroprocesos.AccesoDatos.TipoProceso tipoProceso;

        private List<Unimaq.Macroprocesos.AccesoDatos.Proceso_Referencia> listProcesoReferencia;
        private List<Unimaq.Macroprocesos.AccesoDatos.Documento> listProcRef_Documento; //REFD
        private List<Unimaq.Macroprocesos.AccesoDatos.Documento> listProcRef_Registro;  //REGI

        private List<Unimaq.Macroprocesos.AccesoDatos.Proceso_Control> listProcesoControl;

        private List<Unimaq.Macroprocesos.AccesoDatos.Proceso_SoporteRecurso> listProcesoSoporte;


        public Proceso()
        {
            InitializeComponent();

            listProcesoReferencia = new List<Unimaq.Macroprocesos.AccesoDatos.Proceso_Referencia>();
            listProcRef_Documento = new List<Unimaq.Macroprocesos.AccesoDatos.Documento>();
            listProcRef_Registro = new List<Unimaq.Macroprocesos.AccesoDatos.Documento>();

            listProcesoControl = new List<Unimaq.Macroprocesos.AccesoDatos.Proceso_Control>();

            listProcesoSoporte = new List<Unimaq.Macroprocesos.AccesoDatos.Proceso_SoporteRecurso>();
        }

        public Proceso(Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso) : this()
        {
            // TODO: Complete member initialization
            this.selectedProceso = selectedProceso;
            btnGuardar.Tag = "M";
        }

        private void ListarEmpresa()
        {
            EmpresaBLL empresaBLL = new EmpresaBLL();
            cmbEmpresa.DataSource = empresaBLL.Listar();
            cmbEmpresa.ValueMember = "Id";
            cmbEmpresa.DisplayMember = "NombreEmpresa";
            cmbEmpresa.SelectedIndex = -1;
        }

        private void LimpiarFormulario()
        {
            ListarEmpresa();
            txtPadreProceso.ResetText();
            txtPadreProceso.Tag = null;
            txtCodigo.ResetText();
            txtNombreProceso.ResetText();
            numNumeroProceso.ResetText();
            txtAcceso.ResetText();
            btnGuardar.Tag = null;
        }

        private void Proceso_Load(object sender, EventArgs e)
        {
            TipoProcesoBLL tipoProcesoBLL = new TipoProcesoBLL();

            ListarEmpresa();
            tipoProceso = tipoProcesoBLL.GetCodigoProceso();

            if (btnGuardar.Tag != null)
            {
                if (btnGuardar.Tag.ToString().Equals("M"))
                {
                    RellenarFormulario();
                    btnEliminar.Enabled = true;
                }
            }
            else
            {
                btnEliminar.Enabled = false;
            }
        }

        private void RellenarFormulario()
        {
            if (selectedProceso != null)
            {
                cmbEmpresa.SelectedIndex = cmbEmpresa.Items.IndexOf(cmbEmpresa.Items.Cast<Unimaq.Macroprocesos.AccesoDatos.Empresa>().SingleOrDefault(x => x.Id.Equals(selectedProceso.IdEmpresa)));                
                Unimaq.Macroprocesos.AccesoDatos.Empresa selectedEmpresa = cmbEmpresa.SelectedItem as Unimaq.Macroprocesos.AccesoDatos.Empresa;

                if (selectedEmpresa != null)
                {                    
                    if (selectedProceso.IdPadreProceso.HasValue)
                    {
                        Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
                        Unimaq.Macroprocesos.AccesoDatos.Proceso sProceso =
                            procesoBLL.ListarxEmpresa(selectedEmpresa).FirstOrDefault(x => x.Id == selectedProceso.IdPadreProceso );

                        if (sProceso != null)
                        {
                            txtPadreProceso.Tag = sProceso;
                            txtPadreProceso.Text = string.Format("{0} {1}", sProceso.CodigoProceso.Trim(), sProceso.Nombre.Trim());
                        }
                    }
                }

                txtCodigo.Text = selectedProceso.CodigoProceso.Trim();
                txtNombreProceso.Text = selectedProceso.Nombre.Trim();
                txtAcceso.Text = selectedProceso.RutaAcceso.Trim();
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            bool correcto = false;

            if (cmbEmpresa.SelectedIndex >= 0)
            {
                if (!string.IsNullOrWhiteSpace(txtCodigo.Text))
                {
                    if (!string.IsNullOrWhiteSpace(txtNombreProceso.Text))
                    {
                        ProcesoBLL procesoBLL = new ProcesoBLL();
                        List<Unimaq.Macroprocesos.AccesoDatos.Proceso> lista = procesoBLL.Buscar(int.Parse(cmbEmpresa.SelectedValue.ToString()), txtCodigo.Text.Trim());

                        if (lista.Count == 0)
                        {
                            correcto = true;
                        }
                        else
                        {                                                        
                            Unimaq.Macroprocesos.AccesoDatos.Proceso proceso = lista.First();

                            if (btnGuardar.Tag != null)
                            {
                                if (btnGuardar.Tag.ToString().Equals("M"))
                                {                                    
                                    if (int.Parse(cmbEmpresa.SelectedValue.ToString()).Equals(proceso.IdEmpresa.HasValue ? proceso.IdEmpresa.Value : -1) &&
                                        txtCodigo.Text.Trim().Equals(proceso.CodigoProceso.Trim()))
                                    {
                                        correcto = true;
                                    }
                                }
                            }
                            else
                            {
                                MessageBox.Show(string.Format("El codigo ingresado ya se encuentra registrado en el siguiente proceso:\nCódigo: {0}\nProceso: {1}", proceso.CodigoProceso.Trim(), proceso.Nombre.Trim()), "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Ingrese el nombre del proceso", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    }
                }
                else
                {
                    MessageBox.Show("Ingrese el codigo del proceso", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                }
            }
            else
            {
                MessageBox.Show("Ingrese la empresa del proceso", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }

            if (correcto)
            {
                ProcesoBLL procesoBLL;
                int resultado = 0;

                Unimaq.Macroprocesos.AccesoDatos.Proceso nuevoProceso =
                    new Unimaq.Macroprocesos.AccesoDatos.Proceso()
                    {
                        IdEmpresa = int.Parse(cmbEmpresa.SelectedValue.ToString()),
                        IdPadreProceso = txtPadreProceso.Tag != null ? (txtPadreProceso.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso).Id : new Nullable<int>(),
                        IdTipoProceso = tipoProceso.Id,
                        CodigoProceso = txtCodigo.Text.Trim(),
                        Nombre = txtNombreProceso.Text.Trim(),
                        NumeroProceso = Convert.ToInt32(numNumeroProceso.Value),
                        RutaAcceso = txtAcceso.Text.Trim()
                    };

                if (btnGuardar.Tag == null)
                {
                    procesoBLL = new ProcesoBLL();
                    resultado = procesoBLL.Registrar(nuevoProceso); 
                }
                else if (btnGuardar.Tag.ToString().Equals("M"))
                {
                    if (selectedProceso != null)
                    {
                        procesoBLL = new ProcesoBLL();
                        Unimaq.Macroprocesos.AccesoDatos.Proceso selProceso = 
                            new Unimaq.Macroprocesos.AccesoDatos.Proceso()
                            {
                                Id = selectedProceso.Id,
                                IdEmpresa = selectedProceso.IdEmpresa,
                                IdPadreProceso = selectedProceso.IdPadreProceso
                            };

                        resultado = procesoBLL.Actualizar(selProceso, nuevoProceso, true);
                        // coger proceso actualizado
                        Unimaq.Macroprocesos.AccesoDatos.Proceso updatedProceso = procesoBLL.GetProceso(selProceso);
                        // actualizo los procesos hijos
                        procesoBLL.ActualizarProcesosHijos(updatedProceso, ref resultado);
                    }
                }

                if (resultado > 0)
                {
                    if (btnGuardar.Tag == null)
                    {
                        MessageBox.Show("Proceso registrado", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }
                    else if (btnGuardar.Tag.ToString().Equals("M"))
                    {
                        MessageBox.Show("Proceso modificado", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                    }

                    LimpiarFormulario();
                    ActualizarArbol();
                    btnEliminar.Enabled = false;
                }
                else
                {
                    MessageBox.Show("Error al registrar el proceso", "Macroprocesos - Unimaq", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    LimpiarFormulario();
                    btnEliminar.Enabled = false;
                }
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (btnGuardar.Tag != null)
            {
                if (btnGuardar.Tag.ToString().Equals("M"))
                {
                    DialogResult dr = MessageBox.Show("¿Esta seguro en eliminar el Proceso?\nAdvertencia: La eliminación del proceso elimina todos los procesos y documentos pertenecientes a él.", "Macroprocesos - UNIMAQ", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2);

                    if (dr == DialogResult.Yes)
                    {
                        //procede a eliminar
                        if (selectedProceso != null)
                        {
                            Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();

                            int value = 0;
                            bool continuar = true;
                            procesoBLL.EliminarProceso(selectedProceso, ref value, continuar);

                            if (value > 0)
                            {
                                MessageBox.Show("Proceso eliminado", "Macroprocesos - UNIMAQ", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
                                LimpiarFormulario();
                                ActualizarArbol();
                                btnEliminar.Enabled = false;
                            }
                            else
                            {
                                MessageBox.Show("Error al eliminar el proceso.\nInformar al Administrador.", "Macroprocesos - UNIMAQ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                                LimpiarFormulario();
                                btnEliminar.Enabled = false;
                            }
                        }
                    }
                }
            }
        }

        private void ActualizarProcesosHijos(Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso, Unimaq.Macroprocesos.AccesoDatos.Proceso nuevoSelectedProceso)
        {
            ProcesoBLL procesoBLL = new ProcesoBLL();
            List<Unimaq.Macroprocesos.AccesoDatos.Proceso> lista = procesoBLL.Listar(selectedProceso);

            foreach (Unimaq.Macroprocesos.AccesoDatos.Proceso p in lista)
            {
                Unimaq.Macroprocesos.AccesoDatos.Proceso newSelectedProceso =
                    new Unimaq.Macroprocesos.AccesoDatos.Proceso()
                    {
                        Id = p.Id, IdEmpresa = p.IdEmpresa, IdPadreProceso = p.IdPadreProceso
                    };

                Unimaq.Macroprocesos.AccesoDatos.Proceso newSelProceso =
                    new Unimaq.Macroprocesos.AccesoDatos.Proceso()
                    {
                        Id = p.Id, IdEmpresa = p.IdEmpresa, IdPadreProceso = p.IdPadreProceso
                    };

                p.IdEmpresa = nuevoSelectedProceso.IdEmpresa;
                procesoBLL.Actualizar(newSelectedProceso, p, true);
                
                ActualizarProcesosHijos(newSelProceso, p);
            }            
        }

        private void ActualizarArbol()
        {
            PrincipalAdministrador iuPrincipalAdministrador = this.ParentForm as PrincipalAdministrador;
            iuPrincipalAdministrador.CargarArbolProcesos();
        }

        private void btnExaminar_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog folderDialog = new FolderBrowserDialog();
            DialogResult dr = folderDialog.ShowDialog();

            if (dr == DialogResult.OK)
            {
                txtAcceso.Text = folderDialog.SelectedPath;
            }
        }

        private void numNumeroProceso_ValueChanged(object sender, EventArgs e)
        {
            if (txtPadreProceso.Tag != null)
            {                
                Unimaq.Macroprocesos.AccesoDatos.Proceso selectedProceso = txtPadreProceso.Tag as Unimaq.Macroprocesos.AccesoDatos.Proceso;
                string codigoProceso = selectedProceso.CodigoProceso.Trim();
                txtCodigo.Text = numNumeroProceso.Value > 0 ? string.Format("{0}-{1}", codigoProceso, Convert.ToInt32(numNumeroProceso.Value).ToString().PadLeft(2, '0')) : codigoProceso;
            }
            else
            {
                //es un proceso padre                
                txtCodigo.Text = string.Format("{0}-{1}",tipoProceso.Codigo.Trim(), Convert.ToInt32(numNumeroProceso.Value).ToString().PadLeft(2, '0'));
            }
        }

        private void btnExaminarProceso_Click(object sender, EventArgs e)
        {
            if (cmbEmpresa.SelectedIndex >= 0)
            {
                Unimaq.Macroprocesos.AccesoDatos.Empresa selEmpresa =
                    cmbEmpresa.SelectedItem as Unimaq.Macroprocesos.AccesoDatos.Empresa;

                if (selEmpresa != null)
                {
                    Dialog_BuscarProceso dialogBuscar = new Dialog_BuscarProceso(selEmpresa);
                    DialogResult dr = dialogBuscar.ShowDialog();

                    if (dr == DialogResult.OK)
                    {
                        Unimaq.Macroprocesos.AccesoDatos.Proceso selProceso = dialogBuscar.SelectedProceso;

                        txtPadreProceso.Tag = selProceso;
                        txtPadreProceso.Text = string.Format("[{0}]-{1}", selProceso.CodigoProceso.Trim(), selProceso.Nombre.Trim());

                        if (selProceso != null)
                        {
                            Unimaq.Macroprocesos.LogicaNegocio.ProcesoBLL procesoBLL = new ProcesoBLL();
                            Unimaq.Macroprocesos.AccesoDatos.Proceso procPadre = procesoBLL.GetProcesoPadre(selProceso);

                            if (selectedProceso != null)
                            {
                                string prefCodPadre = selProceso.CodigoProceso;
                                string endCodProceso = selectedProceso.CodigoProceso.Substring(selectedProceso.CodigoProceso.LastIndexOf('-') + 1);

                                //string codigoProceso = selProceso.CodigoProceso.Trim();
                                numNumeroProceso.ResetText();
                                txtCodigo.Text = string.Format("{0}-{1}", prefCodPadre, endCodProceso);
                            }
                            else
                            {
                                
                            }                            
                        }
                    }
                }
            }
            else
            {
                MessageBox.Show("Seleccione la empresa para asignarle el proceso", "Macroprocesos - UNIMAQ", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
            }
        }

        private void btnAddRefDocumentaria_Click(object sender, EventArgs e)
        {
            Dialog_BuscarDocumento iuDialog = new Dialog_BuscarDocumento();
            
            if (iuDialog.ShowDialog() == DialogResult.OK)
            {
                Unimaq.Macroprocesos.AccesoDatos.Documento selDocumento= iuDialog.SelectedDocumento;

                if (selDocumento != null)
                {
                    Unimaq.Macroprocesos.LogicaNegocio.TipoDocumentoBLL tipoDocumentoBLL = new TipoDocumentoBLL();

                    Unimaq.Macroprocesos.AccesoDatos.Proceso_Referencia newProcReferencia =
                        new Unimaq.Macroprocesos.AccesoDatos.Proceso_Referencia()
                        {
                            IdDocumento = selDocumento.Id,
                            TipoDocumento = tipoDocumentoBLL.Buscar(selDocumento.IdTipoDocumento.Value).Codigo,
                            Flag = "REFD"
                        };

                    listProcesoReferencia.Add(newProcReferencia);
                    listProcRef_Documento.Add(selDocumento);
                    //en el grid solo se muestra el documento
                    gridRefDocumentaria.DataSource = null;
                    gridRefDocumentaria.DataSource = listProcRef_Documento;
                    gridRefDocumentaria.ClearSelection();
                }
            }
        }

        private void gridRefDocumentaria_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridRefDocumentaria.DataSource != null)
            {
                gridRefDocumentaria.Columns["Id"].Visible = false;
                gridRefDocumentaria.Columns["IdProceso"].Visible = false;
                gridRefDocumentaria.Columns["IdTipoDocumento"].Visible = false;
                gridRefDocumentaria.Columns["Codigo"].HeaderText = "Código";
                gridRefDocumentaria.Columns["Nombre"].HeaderText = "Documento";
                gridRefDocumentaria.Columns["NumeroDocumento"].Visible = false;
                gridRefDocumentaria.Columns["RutaAcceso"].HeaderText = "Ruta";
                gridRefDocumentaria.Columns["RutaAcceso"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader;
                gridRefDocumentaria.Columns["TipoDocumento"].Visible = false;
                gridRefDocumentaria.Columns["Proceso"].Visible = false;
            }
        }

        private void btnAddControProceso_Click(object sender, EventArgs e)
        {
            Dialog_Add_Proceso_Control iuDialog = new Dialog_Add_Proceso_Control();

            if (iuDialog.ShowDialog() == DialogResult.OK)
            {
                Unimaq.Macroprocesos.AccesoDatos.Proceso_Control newProcesoControl = iuDialog.Resultado;

                if (newProcesoControl != null)
                {
                    listProcesoControl.Add(newProcesoControl);

                    gridControlProceso.DataSource = null;
                    gridControlProceso.DataSource = listProcesoControl;
                    gridControlProceso.ClearSelection();
                }
            }
        }

        private void gridControlProceso_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridControlProceso.DataSource != null)
            {
                gridControlProceso.Columns["Id"].Visible = false;
                gridControlProceso.Columns["IdProceso"].Visible = false;
                gridControlProceso.Columns["ParametroControl"].HeaderText = "Parametro de Control\nMedición/Seguimento";
                gridControlProceso.Columns["ParametroControl"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                gridControlProceso.Columns["Indicador"].HeaderText = "Indicador";
                gridControlProceso.Columns["Frecuencia"].HeaderText = "Frecuencia";
                gridControlProceso.Columns["Proceso"].Visible = false;
            }
        }

        private void btnAddRegistro_Click(object sender, EventArgs e)
        {
            Dialog_BuscarDocumento iuDialog = new Dialog_BuscarDocumento();

            if (iuDialog.ShowDialog() == DialogResult.OK)
            {
                Unimaq.Macroprocesos.AccesoDatos.Documento selDocumento = iuDialog.SelectedDocumento;

                if (selDocumento != null)
                {
                    Unimaq.Macroprocesos.LogicaNegocio.TipoDocumentoBLL tipoDocumentoBLL = new TipoDocumentoBLL();

                    Unimaq.Macroprocesos.AccesoDatos.Proceso_Referencia newProcReferencia =
                        new Unimaq.Macroprocesos.AccesoDatos.Proceso_Referencia()
                        {
                            IdDocumento = selDocumento.Id,
                            TipoDocumento = tipoDocumentoBLL.Buscar(selDocumento.IdTipoDocumento.Value).Codigo,
                            Flag = "REGI"
                        };

                    listProcesoReferencia.Add(newProcReferencia);
                    listProcRef_Registro.Add(selDocumento);
                    //en el grid solo se muestra el documento
                    gridRegistros.DataSource = null;
                    gridRegistros.DataSource = listProcRef_Registro;
                    gridRegistros.ClearSelection();
                }
            }
        }

        private void gridRegistros_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridRegistros.DataSource != null)
            {
                gridRegistros.Columns["Id"].Visible = false;
                gridRegistros.Columns["IdProceso"].Visible = false;
                gridRegistros.Columns["IdTipoDocumento"].Visible = false;
                gridRegistros.Columns["Codigo"].HeaderText = "Código";
                gridRegistros.Columns["Nombre"].HeaderText = "Documento";
                gridRegistros.Columns["NumeroDocumento"].Visible = false;
                gridRegistros.Columns["RutaAcceso"].HeaderText = "Ruta";
                gridRegistros.Columns["RutaAcceso"].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCellsExceptHeader;
                gridRegistros.Columns["TipoDocumento"].Visible = false;
                gridRegistros.Columns["Proceso"].Visible = false;
            }
        }

        private void btnAddProcesoSoporte_Click(object sender, EventArgs e)
        {
            Dialog_Add_Proceso_SoporteRecurso iuDialog = new Dialog_Add_Proceso_SoporteRecurso();

            if (iuDialog.ShowDialog() == DialogResult.OK)
            {
                Unimaq.Macroprocesos.AccesoDatos.Proceso_SoporteRecurso newProcesoSoporte = iuDialog.Resultado;

                if (newProcesoSoporte != null)
                {
                    listProcesoSoporte.Add(newProcesoSoporte);

                    gridProcesosSoporte.DataSource = null;
                    gridProcesosSoporte.DataSource = listProcesoSoporte;
                    gridProcesosSoporte.ClearSelection();
                }
            }
        }

        private void gridProcesosSoporte_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            if (gridProcesosSoporte.DataSource != null)
            {
                gridProcesosSoporte.Columns["Id"].Visible = false;
                gridProcesosSoporte.Columns["IdProceso"].Visible = false;
                gridProcesosSoporte.Columns["ProcesoSoporte"].HeaderText = "Procesos de Soporte";
                gridProcesosSoporte.Columns["Recursos"].HeaderText = "Recursos";       
                gridProcesosSoporte.Columns["Proceso"].Visible = false;
            }
        }
    }
}
